Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
data.table 1.12.8 using 8 threads (see ?getDTthreads).  Latest news: r-datatable.com

1 Evolution in Switzerland and Western Europe

The figures do not represent the same thing in each country, depending on the extent of the screening tests carried out. Regardless of this problem, the weekly and daily trend curves allow you to get an idea of the foreseeable evolution for the next days (assuming that the screening strategy does not change over time). Respectively, it provides an indication of a possible inflection of the progression of the epidemic in the near future.

1.1 Switzerland

1.2 Italy

1.3 France

1.4 Germany

1.5 Austria

1.6 Spain

1.7 Great Britain

1.8 Denmark

1.9 Norway

1.10 Sweden

1.11 Iceland

2 What Happened in Hubei Province (China)

3 What Is Happening in USA

4 Comparison of Number of Confirmed Cases in Western Europe

5 Comparison of Number of Deaths in Western Europe

6 Comparison of Number of Recovered Cases in Western Europe

WARNING: The figures seem to be wrong on March 23, 2020.

7 Comparison of Number of Active Cases in Western Europe

WARNING: The figures seem to be wrong on March 23, 2020.

8 About

All the graphs above are generated from the data provided by Johns Hopkins CSSE (provided to the public strictly for educational and academic research purposes).

The source code for generating the graphs is available under MIT License at https://github.com/philippe-docourt/COVID-19/blob/master/covid_19_western_europe.Rmd.

The data are provided as 2019 Novel Coronavirus COVID-19 (2019-nCoV) Data Repository by Johns Hopkins CSSE (see https://github.com/CSSEGISandData/COVID-19).

See https://github.com/philippe-docourt/COVID-19/blob/master/README.md for more details.

8.1 Data Sources

8.2 Terms of Use

LS0tCnRpdGxlOiAiQ09WSUQtMTkgaW4gU3dpdHplcmxhbmQgYW5kIFdlc3Rlcm4gRXVyb3BlIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogCiAgICBmaWdfaGVpZ2h0OiA1CiAgICBmaWdfd2lkdGg6IDcKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgICB0b2M6IHllcwogIGh0bWxfZG9jdW1lbnQ6IAogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRvYzogeWVzCiAgd29yZF9kb2N1bWVudDogCiAgICB0b2M6IHllcwogIHBkZl9kb2N1bWVudDogZGVmYXVsdApkYXRlOiAiTGFzdCB1cGRhdGVkOiBgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWSAtICVIOiVNJylgIgphdXRob3I6ICJQaGlsaXBwZSBEb2NvdXJ0IgotLS0KCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KGRhdGEudGFibGUpCgpnZXRfdGltZXNlcmllc19hc192ZWN0b3IgPC0gZnVuY3Rpb24oZGYpIHsKICB0bXAgPC0gc3Vic2V0KGRmLCBzZWxlY3QgPSAtYygxOjQpKQogIHRtcCA8LSBzYXBwbHkoYXMudmVjdG9yKHRyYW5zcG9zZSh0bXApKSwgYXMuaW50ZWdlcikKICByZXR1cm4odG1wKQp9CgpwbG90X3RpbWVfc2VyaWVzX2Zvcl9jb3VudHJ5IDwtIGZ1bmN0aW9uKGNvdW50cnkuY29uZmlybWVkLCBjb3VudHJ5LmRlYXRocywgY291bnRyeS5yZWNvdmVyZWQsIGNvdW50cnkubmFtZSwgcHVibGljLnNwYWNlcy5jbG9zZWQuYXQ9TkEsIGNvbmZpbmVtZW50LmF0PU5BLCB0cmVuZC5hbmdsZT0yMCkgewogICAgZGF5LmNvdW50IDwtIG5yb3coY291bnRyeS5jb25maXJtZWQpCiAgeWxpbSA8LSBjKDAsIDEuMyAqIG1heChjb3VudHJ5LmNvbmZpcm1lZCwgbmEucm0gPSBUUlVFKSkKICBkYXkuc3RhcnQgPC0gbWluKGMoNDUsIHB1YmxpYy5zcGFjZXMuY2xvc2VkLmF0LCBjb25maW5lbWVudC5hdCksIG5hLnJtID0gVFJVRSkKICBwbG90KGNvdW50cnkuY29uZmlybWVkLCBtYWluPSBwYXN0ZSgiQ2FzZXMgaW4iLCBjb3VudHJ5Lm5hbWUpLCB0eXBlID0gIm8iLCB4bGFiID0gIkRheXMgU2luY2UgSmFudWFyeSAyMSwgMjAyMCIsIHlsYWIgPSAiTnVtYmVyIG9mIENhc2VzIiwgY29sID0gInJlZCIsIHhsaW0gPSAgYyhkYXkuc3RhcnQsIGRheS5jb3VudCArIDcpLCB5bGltID0geWxpbSkKICBsaW5lcyhzZXEoMSwgbGVuZ3RoKGNvdW50cnkuZGVhdGhzKSksIGNvdW50cnkuZGVhdGhzLCB0eXBlID0gImwiLCBjb2wgPSAiYmxhY2siLCBsdHkgPSAxLCBsdyA9IDEpCiAgbGluZXMoc2VxKDEsIGxlbmd0aChjb3VudHJ5LnJlY292ZXJlZCkpLCBjb3VudHJ5LnJlY292ZXJlZCwgdHlwZSA9ICJsIiwgY29sID0gImdyZWVuIiwgbHR5ID0gMSwgbHcgPSAxKQogIGdyaWQoKQoKICAjIFRyZW5kIGJhc2VkIG9uIGxhc3QgdHdvIG9ic2VydmF0aW9ucyAobGFzdCBkYXkpLgogIGxhc3QuY29uZmlybWVkIDwtIHRhaWwoY291bnRyeS5jb25maXJtZWQsIG4gPSAyKQogIGR5IDwtbGFzdC5jb25maXJtZWRbMl0gLSBsYXN0LmNvbmZpcm1lZFsxXQogIHNsb3BlIDwtIGR5CiAgdSA8LSBjKDEsIGR5KQogIGEgPC0gbGFzdC5jb25maXJtZWRbMV0gLSAoZGF5LmNvdW50IC0gMSkgKiBzbG9wZQogIGFibGluZShhID0gYSwgYiA9IHNsb3BlLCBjb2wgPSAidmlvbGV0IiwgbHcgPSAxLjUsIGx0eSA9IDQpCiAgbGFzdC5wcm9ncmVzc2lvbi5wY3QgPC0gcm91bmQoKDEwMCAqIGR5KSAvIGxhc3QuY29uZmlybWVkWzFdKQogIHRleHQoeCA9IGRheS5jb3VudCAtIDIwLCB5ID0gMC41NSAqIHlsaW1bMl0sIHBhc3RlKGR5LCAiY2FzZXMvZGF5XG5FeHRyYXBvbGF0aW9uOiIsIGR5ICogNywgImNhc2Uvdy5cbiIsIGxhc3QucHJvZ3Jlc3Npb24ucGN0LCAiJSBwcm9ncmVzcyBsYXN0IGRheSIpLCBzcnQgPSB0cmVuZC5hbmdsZSwgY29sID0gInZpb2xldCIpCiAgCiAgIyBUcmVuZCBiYXNlZCBvbiBsYXN0IDggb2JzZXJ2YXRpb25zICg3IGludGVydmFscywgb25lIHdlZWspCiAgbGFzdC5jb25maXJtZWQgPC0gdGFpbChjb3VudHJ5LmNvbmZpcm1lZCwgbiA9IDgpCiAgZHkgPC1sYXN0LmNvbmZpcm1lZFs4XSAtIGxhc3QuY29uZmlybWVkWzFdCiAgc2xvcGUgPC0gZHkgLyA3CiAgdSA8LSBjKDcsIGR5KQogIGEgPC0gbGFzdC5jb25maXJtZWRbMV0gLSAoZGF5LmNvdW50IC0gNykgKiBzbG9wZQogIGFibGluZShhID0gYSwgYiA9IHNsb3BlLCBjb2wgPSAiYmxhY2siLCBsdyA9IDEuNSwgbHR5ID0gNCkKICBsYXN0LnByb2dyZXNzaW9uLnBjdCA8LSByb3VuZCgoMTAwICogZHkpIC8gbGFzdC5jb25maXJtZWRbMV0pCiAgdGV4dCh4ID0gZGF5LmNvdW50IC0gMTUsIHkgPSAoMC44OCAtICh0cmVuZC5hbmdsZS8zMDAwKSkgKiB5bGltWzJdLCBwYXN0ZShkeSwgImNhc2VzL3cuXG5Bdmc6IiwgZHkgJS8lIDcsICJjYXNlL2RheVxuIiwgbGFzdC5wcm9ncmVzc2lvbi5wY3QsICIlIHByb2dyZXNzIGxhc3Qgd2VlayIpLCBzcnQgPSB0cmVuZC5hbmdsZSwgY29sID0gImJsYWNrIikKICAKICAjIFNob3cgc3BlY2lhbCBtZWFzdXJlcyBhZ2FpbnN0IHByb3BhZ2F0aW9uLgogIHlwb3MgPSBtYXgoY291bnRyeS5jb25maXJtZWQsIG5hLnJtID0gVFJVRSkgJS8lIDMKICBpZiAoIWlzLm5hKHB1YmxpYy5zcGFjZXMuY2xvc2VkLmF0KSkgewogICAgYWJsaW5lKHYgPSBwdWJsaWMuc3BhY2VzLmNsb3NlZC5hdCwgY29sID0gImJsdWUiLCBsdyA9IDEsIGx0eSA9IDUpCiAgICB0ZXh0KHggPSBwdWJsaWMuc3BhY2VzLmNsb3NlZC5hdCAtIDEsIHkgPSB5cG9zLCAiQWxsIHB1YmxpYyBzcGFjZXMgYXJlIGNsb3NlZCIsIGNvbCA9ICJibHVlIiwgc3J0ID0gOTApCiAgfQogIGlmICghaXMubmEoY29uZmluZW1lbnQuYXQpKSB7CiAgICBhYmxpbmUodiA9IGNvbmZpbmVtZW50LmF0LCBjb2wgPSAicmVkIiwgbHcgPSAxLCBsdHkgPSA1KQogICAgdGV4dCh4ID0gY29uZmluZW1lbnQuYXQgLSAxLCB5ID0geXBvcywgIlBvcHVsYXRpb24gaXMgY29uZmluZWQiLCBjb2wgPSAicmVkIiwgc3J0ID0gOTApCiAgfQogIAogIGxlZ2VuZCgidG9wbGVmdCIsIGxlZ2VuZCA9IGMoIkNvbmZpcm1lZCIsICJEZWF0aHMiLCAiUmVjb3ZlcmVkIiwgIkNvbmZpcm1lZCB0cmVuZCBiYXNlZCBvbiBsYXN0IGRheSIsICJDb25maXJtZWQgdHJlbmQgYmFzZWQgb24gbGFzdCB3ZWVrIiksIGNvbCA9IGMoInJlZCIsICJibGFjayIsICJncmVlbiIsICJ2aW9sZXQiLCAiYmxhY2siKSwgbHR5ID0gYyhyZXAoMSwgMyksIDIsIDMpLCBsdyA9IGMocmVwKDEsIDMpLCAxLjUsIDEuNSkpCiAgCiAgZGlmZnMgPC0gZGlmZihjb3VudHJ5LmNvbmZpcm1lZCkKICBwbG90KHNlcSgyLCBkYXkuY291bnQpLCBkaWZmcywgdHlwZSA9ICJoIiwgY29sID0gImJsdWUiLCB4bGltID0gIGMoZGF5LnN0YXJ0ICsgMSwgZGF5LmNvdW50KSwgbWFpbiA9IHBhc3RlKCJOZXcgQ29uZmlybWVkIENhc2VzIHBlciBEYXkiLCBjb3VudHJ5Lm5hbWUsIHNlcCA9ICIgaW4gIiksIHhsYWIgPSAiRGF5cyBTaW5jZSBKYW51YXJ5IDIxLCAyMDIwIiwgeWxhYiA9ICJOdW1iZXIgb2YgTmV3IENhc2VzIHBlciBEYXkiLCBsd2QgPSA1KQogIGdyaWQoKQogIAogIGRpZmZzIDwtIGRpZmYoY291bnRyeS5kZWF0aHMpCiAgcGxvdChzZXEoMiwgZGF5LmNvdW50KSwgZGlmZnMsIHR5cGUgPSAiaCIsIGNvbCA9ICJibGFjayIsIHhsaW0gPSAgYyhkYXkuc3RhcnQgKyAxLCBkYXkuY291bnQpLCBtYWluID0gcGFzdGUoIk5ldyBEZWF0aHMgcGVyIERheSIsIGNvdW50cnkubmFtZSwgc2VwID0gIiBpbiAiKSwgeGxhYiA9ICJEYXlzIFNpbmNlIEphbnVhcnkgMjEsIDIwMjAiLCB5bGFiID0gIk51bWJlciBvZiBOZXcgRGVhdGhzIHBlciBEYXkiLCBsd2QgPSA1KQogIGdyaWQoKQogIAogIGlmICghaXMubmEoY291bnRyeS5yZWNvdmVyZWQpKSB7CiAgICBkaWZmcyA8LSBkaWZmKGNvdW50cnkucmVjb3ZlcmVkKQogICAgcGxvdChzZXEoMiwgZGF5LmNvdW50KSwgZGlmZnMsIHR5cGUgPSAiaCIsIGNvbCA9ICJncmVlbiIsIHhsaW0gPSAgYyhkYXkuc3RhcnQgKyAxLCBkYXkuY291bnQpLCAgbWFpbiA9IHBhc3RlKCJOZXcgUmVjb3ZlcmVkIENhc2VzIHBlciBEYXkgaW4iLCBjb3VudHJ5Lm5hbWUsIHNlcCA9ICIgaW4gIiksIHhsYWIgPSAiRGF5cyBTaW5jZSBKYW51YXJ5IDIxLCAyMDIwIiwgeWxhYiA9ICJOdW1iZXIgb2YgTmV3IFJlY292ZXJlZCBDYXNlcyBwZXIgRGF5IiwgbHdkID0gNSkKICAgIGdyaWQoKQogICAgCiAgICBkaWZmcyA8LSBkaWZmKGNvdW50cnkuY29uZmlybWVkIC0gKGNvdW50cnkuZGVhdGhzICsgY291bnRyeS5yZWNvdmVyZWQpKQogICAgcGxvdChzZXEoMiwgZGF5LmNvdW50KSwgZGlmZnMsIHR5cGUgPSAiaCIsIGNvbCA9ICJyZWQiLCB4bGltID0gIGMoZGF5LnN0YXJ0ICsgMSwgZGF5LmNvdW50KSwgbWFpbiA9IHBhc3RlKCJOZXcgQWN0aXZlIENhc2VzIHBlciBEYXkiLCBjb3VudHJ5Lm5hbWUsIHNlcCA9ICIgaW4gIiksIHhsYWIgPSAiRGF5cyBTaW5jZSBKYW51YXJ5IDIxLCAyMDIwIiwgeWxhYiA9ICJOdW1iZXIgb2YgTmV3IEFjdGl2ZSBDYXNlcyBwZXIgRGF5IiwgbHdkPTUpCiAgICBncmlkKCkKICB9Cn0KCmNvdmlkIDwtIHJlYWQuY3N2KCJjc3NlX2NvdmlkXzE5X2RhdGEvY3NzZV9jb3ZpZF8xOV90aW1lX3Nlcmllcy90aW1lX3Nlcmllc19jb3ZpZDE5X2NvbmZpcm1lZF9nbG9iYWwuY3N2IikKY292aWQuZGVhdGhzIDwtIHJlYWQuY3N2KCJjc3NlX2NvdmlkXzE5X2RhdGEvY3NzZV9jb3ZpZF8xOV90aW1lX3Nlcmllcy90aW1lX3Nlcmllc19jb3ZpZDE5X2RlYXRoc19nbG9iYWwuY3N2IikKY292aWQucmVjb3ZlcmVkIDwtIHJlYWQuY3N2KCJjc3NlX2NvdmlkXzE5X2RhdGEvY3NzZV9jb3ZpZF8xOV90aW1lX3Nlcmllcy90aW1lX3Nlcmllc19jb3ZpZDE5X3JlY292ZXJlZF9nbG9iYWwuY3N2IikKCmNvdW50cnkubmFtZXMgPC0gYygiU3dpdHplcmxhbmQiLCAiSXRhbHkiLCAiRnJhbmNlIiwgIkdlcm1hbnkiLCAiQXVzdHJpYSIgLCAiU3BhaW4iLCAiR3JlYXQgQnJpdGFpbiIsICJEZW5tYXJrIiwgIk5vcndheSIsICJTd2VkZW4iLCAiSWNlbGFuZCIpCmNvdW50cnkuY291bnQgPC0gbGVuZ3RoKGNvdW50cnkubmFtZXMpCmNvbCA8LSByYWluYm93KGNvdW50cnkuY291bnQpCmx0eSA8LSBzZXEoMSwgY291bnRyeS5jb3VudCkKcGNoIDwtIHNlcSgxMCwgMTAgKyBjb3VudHJ5LmNvdW50KQoKc3dpdHplcmxhbmQuY29uZmlybWVkIDwtIGdldF90aW1lc2VyaWVzX2FzX3ZlY3RvcihzdWJzZXQoY292aWQsIENvdW50cnkuUmVnaW9uID09ICJTd2l0emVybGFuZCIpKQpzd2l0emVybGFuZC5kZWF0aHMgPC0gZ2V0X3RpbWVzZXJpZXNfYXNfdmVjdG9yKHN1YnNldChjb3ZpZC5kZWF0aHMsIENvdW50cnkuUmVnaW9uID09ICJTd2l0emVybGFuZCIpKQpzd2l0emVybGFuZC5yZWNvdmVyZWQgPC0gZ2V0X3RpbWVzZXJpZXNfYXNfdmVjdG9yKHN1YnNldChjb3ZpZC5yZWNvdmVyZWQsIENvdW50cnkuUmVnaW9uID09ICJTd2l0emVybGFuZCIpKQoKaXRhbHkuY29uZmlybWVkIDwtIGdldF90aW1lc2VyaWVzX2FzX3ZlY3RvcihzdWJzZXQoY292aWQsIENvdW50cnkuUmVnaW9uID09ICJJdGFseSIpKQppdGFseS5kZWF0aHMgPC0gZ2V0X3RpbWVzZXJpZXNfYXNfdmVjdG9yKHN1YnNldChjb3ZpZC5kZWF0aHMsIENvdW50cnkuUmVnaW9uID09ICJJdGFseSIpKQppdGFseS5yZWNvdmVyZWQgPC0gZ2V0X3RpbWVzZXJpZXNfYXNfdmVjdG9yKHN1YnNldChjb3ZpZC5yZWNvdmVyZWQsIENvdW50cnkuUmVnaW9uID09ICJJdGFseSIpKQoKZnJhbmNlLmNvbmZpcm1lZCA8LSBnZXRfdGltZXNlcmllc19hc192ZWN0b3Ioc3Vic2V0KGNvdmlkLCBDb3VudHJ5LlJlZ2lvbiA9PSAiRnJhbmNlIiAmIFByb3ZpbmNlLlN0YXRlID09ICIiKSkKZnJhbmNlLmRlYXRocyA8LSBnZXRfdGltZXNlcmllc19hc192ZWN0b3Ioc3Vic2V0KGNvdmlkLmRlYXRocywgQ291bnRyeS5SZWdpb24gPT0gIkZyYW5jZSIgJiBQcm92aW5jZS5TdGF0ZSA9PSAiIikpCmZyYW5jZS5yZWNvdmVyZWQgPC0gZ2V0X3RpbWVzZXJpZXNfYXNfdmVjdG9yKHN1YnNldChjb3ZpZC5yZWNvdmVyZWQsIENvdW50cnkuUmVnaW9uID09ICJGcmFuY2UiICYgUHJvdmluY2UuU3RhdGUgPT0gIiIpKQoKZ2VybWFueS5jb25maXJtZWQgPC0gZ2V0X3RpbWVzZXJpZXNfYXNfdmVjdG9yKHN1YnNldChjb3ZpZCwgQ291bnRyeS5SZWdpb24gPT0gIkdlcm1hbnkiKSkKZ2VybWFueS5kZWF0aHMgPC0gZ2V0X3RpbWVzZXJpZXNfYXNfdmVjdG9yKHN1YnNldChjb3ZpZC5kZWF0aHMsIENvdW50cnkuUmVnaW9uID09ICJHZXJtYW55IikpCmdlcm1hbnkucmVjb3ZlcmVkIDwtIGdldF90aW1lc2VyaWVzX2FzX3ZlY3RvcihzdWJzZXQoY292aWQucmVjb3ZlcmVkLCBDb3VudHJ5LlJlZ2lvbiA9PSAiR2VybWFueSIpKQoKYXVzdHJpYS5jb25maXJtZWQgPC0gZ2V0X3RpbWVzZXJpZXNfYXNfdmVjdG9yKHN1YnNldChjb3ZpZCwgQ291bnRyeS5SZWdpb24gPT0gIkF1c3RyaWEiKSkKYXVzdHJpYS5kZWF0aHMgPC0gZ2V0X3RpbWVzZXJpZXNfYXNfdmVjdG9yKHN1YnNldChjb3ZpZC5kZWF0aHMsIENvdW50cnkuUmVnaW9uID09ICJBdXN0cmlhIikpCmF1c3RyaWEucmVjb3ZlcmVkIDwtIGdldF90aW1lc2VyaWVzX2FzX3ZlY3RvcihzdWJzZXQoY292aWQucmVjb3ZlcmVkLCBDb3VudHJ5LlJlZ2lvbiA9PSAiQXVzdHJpYSIpKQoKc3BhaW4uY29uZmlybWVkIDwtIGdldF90aW1lc2VyaWVzX2FzX3ZlY3RvcihzdWJzZXQoY292aWQsIENvdW50cnkuUmVnaW9uID09ICJTcGFpbiIpKQpzcGFpbi5kZWF0aHMgPC0gZ2V0X3RpbWVzZXJpZXNfYXNfdmVjdG9yKHN1YnNldChjb3ZpZC5kZWF0aHMsIENvdW50cnkuUmVnaW9uID09ICJTcGFpbiIpKQpzcGFpbi5yZWNvdmVyZWQgPC0gZ2V0X3RpbWVzZXJpZXNfYXNfdmVjdG9yKHN1YnNldChjb3ZpZC5yZWNvdmVyZWQsIENvdW50cnkuUmVnaW9uID09ICJTcGFpbiIpKQoKdWsuY29uZmlybWVkIDwtIGdldF90aW1lc2VyaWVzX2FzX3ZlY3RvcihzdWJzZXQoY292aWQsIENvdW50cnkuUmVnaW9uID09ICJVbml0ZWQgS2luZ2RvbSIgJiBQcm92aW5jZS5TdGF0ZSA9PSAiIikpCnVrLmRlYXRocyA8LSBnZXRfdGltZXNlcmllc19hc192ZWN0b3Ioc3Vic2V0KGNvdmlkLmRlYXRocywgQ291bnRyeS5SZWdpb24gPT0gIlVuaXRlZCBLaW5nZG9tIiAmIFByb3ZpbmNlLlN0YXRlID09ICIiKSkKdWsucmVjb3ZlcmVkIDwtIGdldF90aW1lc2VyaWVzX2FzX3ZlY3RvcihzdWJzZXQoY292aWQucmVjb3ZlcmVkLCBDb3VudHJ5LlJlZ2lvbiA9PSAiVW5pdGVkIEtpbmdkb20iICYgUHJvdmluY2UuU3RhdGUgPT0gIiIpKQoKZGVubWFyay5jb25maXJtZWQgPC0gZ2V0X3RpbWVzZXJpZXNfYXNfdmVjdG9yKHN1YnNldChjb3ZpZCwgQ291bnRyeS5SZWdpb24gPT0gIkRlbm1hcmsiICYgUHJvdmluY2UuU3RhdGUgPT0gIiIpKQpkZW5tYXJrLmRlYXRocyA8LSBnZXRfdGltZXNlcmllc19hc192ZWN0b3Ioc3Vic2V0KGNvdmlkLmRlYXRocywgQ291bnRyeS5SZWdpb24gPT0gIkRlbm1hcmsiICYgUHJvdmluY2UuU3RhdGUgPT0gIiIpKQpkZW5tYXJrLnJlY292ZXJlZCA8LSBnZXRfdGltZXNlcmllc19hc192ZWN0b3Ioc3Vic2V0KGNvdmlkLnJlY292ZXJlZCwgQ291bnRyeS5SZWdpb24gPT0gIkRlbm1hcmsiICYgUHJvdmluY2UuU3RhdGUgPT0gIiIpKQoKbm9yd2F5LmNvbmZpcm1lZCA8LSBnZXRfdGltZXNlcmllc19hc192ZWN0b3Ioc3Vic2V0KGNvdmlkLCBDb3VudHJ5LlJlZ2lvbiA9PSAiSWNlbGFuZCIpKQpub3J3YXkuZGVhdGhzIDwtIGdldF90aW1lc2VyaWVzX2FzX3ZlY3RvcihzdWJzZXQoY292aWQuZGVhdGhzLCBDb3VudHJ5LlJlZ2lvbiA9PSAiSWNlbGFuZCIpKQpub3J3YXkucmVjb3ZlcmVkIDwtIGdldF90aW1lc2VyaWVzX2FzX3ZlY3RvcihzdWJzZXQoY292aWQucmVjb3ZlcmVkLCBDb3VudHJ5LlJlZ2lvbiA9PSAiSWNlbGFuZCIpKQoKc3dlZGVuLmNvbmZpcm1lZCA8LSBnZXRfdGltZXNlcmllc19hc192ZWN0b3Ioc3Vic2V0KGNvdmlkLCBDb3VudHJ5LlJlZ2lvbiA9PSAiU3dlZGVuIikpCnN3ZWRlbi5kZWF0aHMgPC0gZ2V0X3RpbWVzZXJpZXNfYXNfdmVjdG9yKHN1YnNldChjb3ZpZC5kZWF0aHMsIENvdW50cnkuUmVnaW9uID09ICJTd2VkZW4iKSkKc3dlZGVuLnJlY292ZXJlZCA8LSBnZXRfdGltZXNlcmllc19hc192ZWN0b3Ioc3Vic2V0KGNvdmlkLnJlY292ZXJlZCwgQ291bnRyeS5SZWdpb24gPT0gIlN3ZWRlbiIpKQoKaWNlbGFuZC5jb25maXJtZWQgPC0gZ2V0X3RpbWVzZXJpZXNfYXNfdmVjdG9yKHN1YnNldChjb3ZpZCwgQ291bnRyeS5SZWdpb24gPT0gIkljZWxhbmQiKSkKaWNlbGFuZC5kZWF0aHMgPC0gZ2V0X3RpbWVzZXJpZXNfYXNfdmVjdG9yKHN1YnNldChjb3ZpZC5kZWF0aHMsIENvdW50cnkuUmVnaW9uID09ICJJY2VsYW5kIikpCmljZWxhbmQucmVjb3ZlcmVkIDwtIGdldF90aW1lc2VyaWVzX2FzX3ZlY3RvcihzdWJzZXQoY292aWQucmVjb3ZlcmVkLCBDb3VudHJ5LlJlZ2lvbiA9PSAiSWNlbGFuZCIpKQoKY291bnRyaWVzLmNvbmZpcm1lZCA8LSBsaXN0KHN3aXR6ZXJsYW5kLmNvbmZpcm1lZCwgaXRhbHkuY29uZmlybWVkLCBmcmFuY2UuY29uZmlybWVkLCBnZXJtYW55LmNvbmZpcm1lZCwgYXVzdHJpYS5jb25maXJtZWQsIHNwYWluLmNvbmZpcm1lZCwgdWsuY29uZmlybWVkLCBkZW5tYXJrLmNvbmZpcm1lZCwgbm9yd2F5LmNvbmZpcm1lZCwgc3dlZGVuLmNvbmZpcm1lZCwgaWNlbGFuZC5jb25maXJtZWQpCmNvdW50cmllcy5kZWF0aHMgPC0gbGlzdChzd2l0emVybGFuZC5kZWF0aHMsIGl0YWx5LmRlYXRocywgZnJhbmNlLmRlYXRocywgZ2VybWFueS5kZWF0aHMsIGF1c3RyaWEuZGVhdGhzLCBzcGFpbi5kZWF0aHMsIHVrLmRlYXRocywgZGVubWFyay5kZWF0aHMsIG5vcndheS5kZWF0aHMsIHN3ZWRlbi5kZWF0aHMsIGljZWxhbmQuZGVhdGhzKQpjb3VudHJpZXMucmVjb3ZlcmVkIDwtIGxpc3Qoc3dpdHplcmxhbmQucmVjb3ZlcmVkLCBpdGFseS5yZWNvdmVyZWQsIGZyYW5jZS5yZWNvdmVyZWQsIGdlcm1hbnkucmVjb3ZlcmVkLCBhdXN0cmlhLnJlY292ZXJlZCwgc3BhaW4ucmVjb3ZlcmVkLCB1ay5yZWNvdmVyZWQsIGRlbm1hcmsucmVjb3ZlcmVkLCBub3J3YXkucmVjb3ZlcmVkLCBzd2VkZW4uY29uZmlybWVkLCBpY2VsYW5kLnJlY292ZXJlZCkKCgpkYXkuY291bnQgPC0gTlJPVyhzd2l0emVybGFuZC5jb25maXJtZWQpCmBgYAoKIyBFdm9sdXRpb24gaW4gU3dpdHplcmxhbmQgYW5kIFdlc3Rlcm4gRXVyb3BlCgpUaGUgZmlndXJlcyBkbyBub3QgcmVwcmVzZW50IHRoZSBzYW1lIHRoaW5nIGluIGVhY2ggY291bnRyeSwgZGVwZW5kaW5nIG9uIHRoZSBleHRlbnQgb2YgdGhlIHNjcmVlbmluZyB0ZXN0cyBjYXJyaWVkIG91dC4gUmVnYXJkbGVzcyBvZiB0aGlzIHByb2JsZW0sIHRoZSB3ZWVrbHkgYW5kIGRhaWx5IHRyZW5kIGN1cnZlcyBhbGxvdyB5b3UgdG8gZ2V0IGFuIGlkZWEgb2YgdGhlIGZvcmVzZWVhYmxlIGV2b2x1dGlvbiBmb3IgdGhlIG5leHQgZGF5cyAoYXNzdW1pbmcgdGhhdCB0aGUgc2NyZWVuaW5nIHN0cmF0ZWd5IGRvZXMgbm90IGNoYW5nZSBvdmVyIHRpbWUpLiBSZXNwZWN0aXZlbHksIGl0IHByb3ZpZGVzIGFuIGluZGljYXRpb24gb2YgYSBwb3NzaWJsZSBpbmZsZWN0aW9uIG9mIHRoZSBwcm9ncmVzc2lvbiBvZiB0aGUgZXBpZGVtaWMgaW4gdGhlIG5lYXIgZnV0dXJlLgoKIyMgU3dpdHplcmxhbmQKYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnBsb3RfdGltZV9zZXJpZXNfZm9yX2NvdW50cnkoc3dpdHplcmxhbmQuY29uZmlybWVkLCBzd2l0emVybGFuZC5kZWF0aHMsIHN3aXR6ZXJsYW5kLnJlY292ZXJlZCwgIlN3aXR6ZXJsYW5kIiwgNTUsIE5BLCB0cmVuZC5hbmdsZSA9IDIwKQpgYGAKCiMjIEl0YWx5CmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpwbG90X3RpbWVfc2VyaWVzX2Zvcl9jb3VudHJ5KGl0YWx5LmNvbmZpcm1lZCwgaXRhbHkuZGVhdGhzLCBpdGFseS5yZWNvdmVyZWQsICJJdGFseSIsIE5BLCB0cmVuZC5hbmdsZSA9IDYpCmBgYAoKIyMgRnJhbmNlCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpwbG90X3RpbWVfc2VyaWVzX2Zvcl9jb3VudHJ5KGZyYW5jZS5jb25maXJtZWQsIGdlcm1hbnkuZGVhdGhzLCBmcmFuY2UucmVjb3ZlcmVkLCAiRnJhbmNlIiwgNTMsIDU2LCB0cmVuZC5hbmdsZSA9IDE1KQpgYGAKCiMjIEdlcm1hbnkKYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnBsb3RfdGltZV9zZXJpZXNfZm9yX2NvdW50cnkoZ2VybWFueS5jb25maXJtZWQsIHN3aXR6ZXJsYW5kLmRlYXRocywgZ2VybWFueS5yZWNvdmVyZWQsICJHZXJtYW55IiwgNDgsIE5BLCB0cmVuZC5hbmdsZSA9IDIwKQpgYGAKCiMjIEF1c3RyaWEKYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnBsb3RfdGltZV9zZXJpZXNfZm9yX2NvdW50cnkoYXVzdHJpYS5jb25maXJtZWQsIGF1c3RyaWEuZGVhdGhzLCBhdXN0cmlhLnJlY292ZXJlZCwgIkF1c3RyaWEiLCA1MiwgTkEsIHRyZW5kLmFuZ2xlID0gMjUpCmBgYAoKIyMgU3BhaW4KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnBsb3RfdGltZV9zZXJpZXNfZm9yX2NvdW50cnkoc3BhaW4uY29uZmlybWVkLCBzcGFpbi5kZWF0aHMsIHNwYWluLnJlY292ZXJlZCwgIlNwYWluIiwgTkEsIDUzLCB0cmVuZC5hbmdsZSA9IDE3KQpgYGAKCiMjIEdyZWF0IEJyaXRhaW4KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnBsb3RfdGltZV9zZXJpZXNfZm9yX2NvdW50cnkodWsuY29uZmlybWVkLCB1ay5kZWF0aHMsIHVrLnJlY292ZXJlZCwgIkdyZWF0IEJyaXRhaW4iLCBOQSwgTkEsIHRyZW5kLmFuZ2xlID0gMTApCmBgYAoKIyMgRGVubWFyawpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0KcGxvdF90aW1lX3Nlcmllc19mb3JfY291bnRyeShkZW5tYXJrLmNvbmZpcm1lZCwgZGVubWFyay5kZWF0aHMsIGRlbm1hcmsucmVjb3ZlcmVkLCAiRGVubWFyayIsIE5BLCBOQSwgdHJlbmQuYW5nbGUgPSA4KQpgYGAKCiMjIE5vcndheQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0KcGxvdF90aW1lX3Nlcmllc19mb3JfY291bnRyeShub3J3YXkuY29uZmlybWVkLCBub3J3YXkuZGVhdGhzLCBub3J3YXkucmVjb3ZlcmVkLCAiTm9yd2F5IiwgTkEsIE5BLCB0cmVuZC5hbmdsZSA9IDApCmBgYAoKIyMgU3dlZGVuCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpwbG90X3RpbWVfc2VyaWVzX2Zvcl9jb3VudHJ5KHN3ZWRlbi5jb25maXJtZWQsIHN3ZWRlbi5kZWF0aHMsIHN3ZWRlbi5yZWNvdmVyZWQsICJTd2VkZW4iLCBOQSwgTkEsIHRyZW5kLmFuZ2xlID0gMTUpCmBgYAoKIyMgSWNlbGFuZApgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0KcGxvdF90aW1lX3Nlcmllc19mb3JfY291bnRyeShpY2VsYW5kLmNvbmZpcm1lZCwgaWNlbGFuZC5kZWF0aHMsIGljZWxhbmQucmVjb3ZlcmVkLCAiSWNlbGFuZCIsIE5BLCBOQSwgdHJlbmQuYW5nbGUgPSAwKQpgYGAKCiMgV2hhdCBIYXBwZW5lZCBpbiBIdWJlaSBQcm92aW5jZSAoQ2hpbmEpCgpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0KaHViZWkuY29uZmlybWVkIDwtIGdldF90aW1lc2VyaWVzX2FzX3ZlY3RvcihzdWJzZXQoY292aWQsIENvdW50cnkuUmVnaW9uID09ICJDaGluYSIgJiBQcm92aW5jZS5TdGF0ZSA9PSAiSHViZWkiKSkKaHViZWkuZGVhdGhzIDwtIGdldF90aW1lc2VyaWVzX2FzX3ZlY3RvcihzdWJzZXQoY292aWQuZGVhdGhzLCBDb3VudHJ5LlJlZ2lvbiA9PSAiQ2hpbmEiICYgUHJvdmluY2UuU3RhdGUgPT0gIkh1YmVpIikpCmh1YmVpLnJlY292ZXJlZCA8LSBnZXRfdGltZXNlcmllc19hc192ZWN0b3Ioc3Vic2V0KGNvdmlkLnJlY292ZXJlZCwgQ291bnRyeS5SZWdpb24gPT0gIkNoaW5hIiAmIFByb3ZpbmNlLlN0YXRlID09ICJIdWJlaSIpKQoKcGxvdF90aW1lX3Nlcmllc19mb3JfY291bnRyeShodWJlaS5jb25maXJtZWQsIGh1YmVpLmRlYXRocywgaHViZWkucmVjb3ZlcmVkLCAiSHViZWkgUHJvdmluY2UsIENoaW5hIiwgTkEsIDIsIHRyZW5kLmFuZ2xlID0gMCkKYGBgCgojIFdoYXQgSXMgSGFwcGVuaW5nIGluIFVTQQoKYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmdldF9zdW1fb2ZfdGltZXNlcmllc19hc192ZWN0b3JfZm9yX3VzYSA8LSBmdW5jdGlvbihkZiwgZXhsdWRlKSB7CiAgdG1wIDwtIGNvbFN1bXMoc3Vic2V0KGRmLCBzZWxlY3QgPSAtZXhsdWRlKSkKICB0bXAgPC0gc2FwcGx5KGFzLnZlY3Rvcih0cmFuc3Bvc2UoYXMubGlzdCh0bXApKSksIGFzLmludGVnZXIpCiAgcmV0dXJuKHRtcCkKfQoKY292aWQudXMgPC0gcmVhZC5jc3YoImNzc2VfY292aWRfMTlfZGF0YS9jc3NlX2NvdmlkXzE5X3RpbWVfc2VyaWVzL3RpbWVfc2VyaWVzX2NvdmlkMTlfY29uZmlybWVkX1VTLmNzdiIpCmNvdmlkLnVzLmRlYXRocyA8LSByZWFkLmNzdigiY3NzZV9jb3ZpZF8xOV9kYXRhL2Nzc2VfY292aWRfMTlfdGltZV9zZXJpZXMvdGltZV9zZXJpZXNfY292aWQxOV9kZWF0aHNfVVMuY3N2IikKCnVzYS5jb25maXJtZWQgPC0gc3Vic2V0KGNvdmlkLnVzLCBpc28zID09ICJVU0EiKQp1c2EuZGVhdGhzIDwtIHN1YnNldChjb3ZpZC51cy5kZWF0aHMsIGlzbzMgPT0gIlVTQSIpCgp1c2EuY29uZmlybWVkIDwtIGdldF9zdW1fb2ZfdGltZXNlcmllc19hc192ZWN0b3JfZm9yX3VzYSh1c2EuY29uZmlybWVkLCBjKDE6MTEpKQp1c2EuZGVhdGhzIDwtIGdldF9zdW1fb2ZfdGltZXNlcmllc19hc192ZWN0b3JfZm9yX3VzYSh1c2EuZGVhdGhzLCBjKDE6MTIpKQoKcGxvdF90aW1lX3Nlcmllc19mb3JfY291bnRyeSh1c2EuY29uZmlybWVkLCB1c2EuZGVhdGhzLCBOQSwgIlVTQSIsIE5BLCBOQSwgdHJlbmQuYW5nbGU9MjUpCmBgYAoKIyBDb21wYXJpc29uIG9mIE51bWJlciBvZiBDb25maXJtZWQgQ2FzZXMgaW4gV2VzdGVybiBFdXJvcGUKCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQp4cmFuZ2UgPC0gYygzNSwgZGF5LmNvdW50KQptYXgueSA8LSAwCmZvciAoaSBpbiBzZXEoMSwgY291bnRyeS5jb3VudCkpIHsKICBtYXgueSA8LSBtYXgoYyhtYXgueSwgY291bnRyaWVzLmNvbmZpcm1lZFtbaV1dKSwgbmEucm0gPSBUUlVFKQp9CnlyYW5nZSA8LSBjKDAsIG1heC55KQpwbG90KHhyYW5nZSwgeXJhbmdlLCBtYWluPSAiQ29uZmlybWVkIENhc2VzIiwgdHlwZSA9ICJuIiwgeGxhYiA9ICJEYXlzIFNpbmNlIDIwMjAtMDEtMjEiLCB5bGFiID0gIk51bWJlciBvZiBDYXNlcyIpCmZvciAoaSBpbiBzZXEoMSwgY291bnRyeS5jb3VudCkpIHsKICBsaW5lcyhzZXEoMSwgZGF5LmNvdW50KSwgY291bnRyaWVzLmNvbmZpcm1lZFtbaV1dLCB0eXBlID0gImIiLCBjb2wgPSBjb2xbaV0sIGx0eSA9IGx0eVtpXSwgcGNoID0gcGNoW2ldLCBsdyA9IDEpCn0KZ3JpZCgpCmxlZ2VuZCgidG9wbGVmdCIsIGxlZ2VuZCA9IGNvdW50cnkubmFtZXMsIGNvbCA9IGNvbCwgbHR5ID0gbHR5LCBwY2ggPSBwY2gsIHRpdGxlID0gIkNvdW50cnkiKQoKbWF4LnkgPC0gMApmb3IgKGkgaW4gc2VxKDEsIGNvdW50cnkuY291bnQpKSB7CiAgbWF4LnkgPC0gbWF4KGMobWF4LnksIGRpZmYodGFpbChjb3VudHJpZXMuY29uZmlybWVkW1tpXV0pKSksIG5hLnJtID0gVFJVRSkKfQp4cmFuZ2UgPC0gYyhkYXkuY291bnQtMTAsIGRheS5jb3VudCkKeXJhbmdlIDwtIGMoMCwgbWF4LnkgKiAyKQpwbG90KHhyYW5nZSwgeXJhbmdlLCBtYWluPSAiTmV3IENvbmZpcm1lZCBDYXNlcyBwZXIgRGF5IChsYXN0IDEwIGRheXMpIiwgdHlwZSA9ICJuIiwgeGxhYiA9ICJEYXlzIFNpbmNlIDIwMjAtMDEtMjEiLCB5bGFiID0gIk51bWJlciBvZiBOZXcgQ2FzZXMgcGVyIERheSIpCmZvciAoaSBpbiBzZXEoMSwgY291bnRyeS5jb3VudCkpIHsKICBsaW5lcyhzZXEoMiwgZGF5LmNvdW50KSAtIDAuNDUgKyAwLjA4ICogaSwgZGlmZihjb3VudHJpZXMuY29uZmlybWVkW1tpXV0pLCB0eXBlID0gImgiLCBjb2wgPSBjb2xbaV0sIGx0eSA9IDEsIGx3ID0gNCkKfQpncmlkKCkKbGVnZW5kKCJ0b3BsZWZ0IiwgbGVnZW5kID0gY291bnRyeS5uYW1lcywgY29sID0gY29sLCBsdHkgPSAxLCBsdyA9IDQsIHRpdGxlID0gIkNvdW50cnkiLCBuY29sID0gNCwgY2V4ID0gMC45KQpgYGAKCiMgQ29tcGFyaXNvbiBvZiBOdW1iZXIgb2YgRGVhdGhzIGluIFdlc3Rlcm4gRXVyb3BlCgpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0KeHJhbmdlIDwtIGMoNDAsIGRheS5jb3VudCkKbWF4LnkgPC0gMApmb3IgKGkgaW4gc2VxKDEsIGNvdW50cnkuY291bnQpKSB7CiAgbWF4LnkgPC0gbWF4KGMobWF4LnksIGNvdW50cmllcy5kZWF0aHNbW2ldXSksIG5hLnJtID0gVFJVRSkKfQp5cmFuZ2UgPC0gYygwLCBtYXgueSkKcGxvdCh4cmFuZ2UsIHlyYW5nZSwgbWFpbj0gIkRlYXRocyIsIHR5cGUgPSAibiIsIHhsYWIgPSAiRGF5cyBTaW5jZSBKYW51YXJ5IDIxLCAyMDIwIiwgeWxhYiA9ICJOdW1iZXIgb2YgRGVhdGhzIikKZm9yIChpIGluIHNlcSgxLCBjb3VudHJ5LmNvdW50KSkgewogIGxpbmVzKHNlcSgxLCBkYXkuY291bnQpLCBjb3VudHJpZXMuZGVhdGhzW1tpXV0sIHR5cGUgPSAiYiIsIGNvbCA9IGNvbFtpXSwgbHR5ID0gbHR5W2ldLCBwY2ggPSBwY2hbaV0sIGx3ID0gMSkKfQpncmlkKCkKbGVnZW5kKCJ0b3BsZWZ0IiwgbGVnZW5kID0gY291bnRyeS5uYW1lcywgY29sID0gY29sLCBsdHkgPSBsdHksIHBjaCA9IHBjaCwgdGl0bGUgPSAiQ291bnRyeSIpCgptYXgueSA8LSAwCmZvciAoaSBpbiBzZXEoMSwgY291bnRyeS5jb3VudCkpIHsKICBtYXgueSA8LSBtYXgoYyhtYXgueSwgZGlmZih0YWlsKGNvdW50cmllcy5kZWF0aHNbW2ldXSkpKSwgbmEucm0gPSBUUlVFKQp9CnhyYW5nZSA8LSBjKGRheS5jb3VudC0xMCwgZGF5LmNvdW50KQp5cmFuZ2UgPC0gYygwLCBtYXgueSAqIDIpCnBsb3QoeHJhbmdlLCB5cmFuZ2UsIG1haW49ICJOZXcgRGVhdGhzIHBlciBEYXkgKGxhc3QgMTAgZGF5cykiLCB0eXBlID0gIm4iLCB4bGFiID0gIkRheXMgU2luY2UgMjAyMC0wMS0yMSIsIHlsYWIgPSAiTnVtYmVyIG9mIE5ldyBEZWF0aHMgcGVyIERheSIpCmZvciAoaSBpbiBzZXEoMSwgY291bnRyeS5jb3VudCkpIHsKICBsaW5lcyhzZXEoMiwgZGF5LmNvdW50KSAtIDAuNDUgKyAwLjA4ICogaSwgZGlmZihjb3VudHJpZXMuZGVhdGhzW1tpXV0pLCB0eXBlID0gImgiLCBjb2wgPSBjb2xbaV0sIGx0eSA9IDEsIGx3ID0gNCkKfQpncmlkKCkKbGVnZW5kKCJ0b3BsZWZ0IiwgbGVnZW5kID0gY291bnRyeS5uYW1lcywgY29sID0gY29sLCBsdHkgPSAxLCBsdyA9IDQsIHRpdGxlID0gIkNvdW50cnkiLCBuY29sID0gNCwgY2V4ID0gMC45KQpgYGAKCiMgQ29tcGFyaXNvbiBvZiBOdW1iZXIgb2YgUmVjb3ZlcmVkIENhc2VzIGluIFdlc3Rlcm4gRXVyb3BlCgpXQVJOSU5HOiBUaGUgZmlndXJlcyBzZWVtIHRvIGJlIHdyb25nIG9uIE1hcmNoIDIzLCAyMDIwLgoKYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnhyYW5nZSA8LSBjKDQwLCBkYXkuY291bnQpCm1heC55IDwtIDAKZm9yIChpIGluIHNlcSgxLCBjb3VudHJ5LmNvdW50KSkgewogIG1heC55IDwtIG1heChjKG1heC55LCBjb3VudHJpZXMucmVjb3ZlcmVkW1tpXV0pLCBuYS5ybSA9IFRSVUUpCn0KeHJhbmdlIDwtIGMoNTAsIGRheS5jb3VudCkKeXJhbmdlIDwtIGMoMCwgbWF4LnkpCnBsb3QoeHJhbmdlLCB5cmFuZ2UsIG1haW49ICJSZWNvdmVyZWQgQ2FzZXMiLCB0eXBlID0gIm4iLCB4bGFiID0gIkRheXMgU2luY2UgSmFudWFyeSAyMSwgMjAyMCIsIHlsYWIgPSAiTnVtYmVyIG9mIENhc2VzIikKZm9yIChpIGluIHNlcSgxLCBjb3VudHJ5LmNvdW50KSkgewogIGQgPC0gbnJvdyhjb3VudHJpZXMucmVjb3ZlcmVkW1tpXV0pCiAgbGluZXMoc2VxKDEsIGQpLCBjb3VudHJpZXMucmVjb3ZlcmVkW1tpXV0sIHR5cGUgPSAiYiIsIGNvbCA9IGNvbFtpXSwgbHR5ID0gbHR5W2ldLCBwY2ggPSBwY2hbaV0sIGx3ID0gMSkKfQpncmlkKCkKbGVnZW5kKCJ0b3BsZWZ0IiwgbGVnZW5kID0gY291bnRyeS5uYW1lcywgY29sID0gY29sLCBsdHkgPSBsdHksIHBjaCA9IHBjaCwgdGl0bGUgPSAiQ291bnRyeSIpCgptYXgueSA8LSAwCmZvciAoaSBpbiBzZXEoMSwgY291bnRyeS5jb3VudCkpIHsKICBtYXgueSA8LSBtYXgoYyhtYXgueSwgZGlmZih0YWlsKGNvdW50cmllcy5yZWNvdmVyZWRbW2ldXSkpKSwgbmEucm0gPSBUUlVFKQp9CnhyYW5nZSA8LSBjKGRheS5jb3VudC0xMCwgZGF5LmNvdW50KQp5cmFuZ2UgPC0gYygwLCBtYXgueSAqIDIpCnBsb3QoeHJhbmdlLCB5cmFuZ2UsIG1haW49ICJOZXcgUmVjb3ZlcmVkIENhc2VzIHBlciBEYXkgKGxhc3QgMTAgZGF5cykiLCB0eXBlID0gIm4iLCB4bGFiID0gIkRheXMgU2luY2UgMjAyMC0wMS0yMSIsIHlsYWIgPSAiTnVtYmVyIG9mIE5ldyBSZWNvdmVyZWQgQ2FzZXMgcGVyIERheSIpCmZvciAoaSBpbiBzZXEoMSwgY291bnRyeS5jb3VudCkpIHsKICBsaW5lcyhzZXEoMiwgZGF5LmNvdW50KSAtIDAuNDUgKyAwLjA4ICogaSwgZGlmZihjb3VudHJpZXMucmVjb3ZlcmVkW1tpXV0pLCB0eXBlID0gImgiLCBjb2wgPSBjb2xbaV0sIGx0eSA9IDEsIGx3ID0gNCkKfQpncmlkKCkKbGVnZW5kKCJ0b3BsZWZ0IiwgbGVnZW5kID0gY291bnRyeS5uYW1lcywgY29sID0gY29sLCBsdHkgPSAxLCBsdyA9IDQsIHRpdGxlID0gIkNvdW50cnkiLCBuY29sID0gNCwgY2V4ID0gMC45KQpgYGAKCiMgQ29tcGFyaXNvbiBvZiBOdW1iZXIgb2YgQWN0aXZlIENhc2VzIGluIFdlc3Rlcm4gRXVyb3BlCgpXQVJOSU5HOiBUaGUgZmlndXJlcyBzZWVtIHRvIGJlIHdyb25nIG9uIE1hcmNoIDIzLCAyMDIwLgoKYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnhyYW5nZSA8LSBjKDQwLCBkYXkuY291bnQpCm1heC55IDwtIDAKZm9yIChpIGluIHNlcSgxLCBjb3VudHJ5LmNvdW50KSkgewogIHkgPC0gY291bnRyaWVzLmNvbmZpcm1lZFtbaV1dIC0gKGNvdW50cmllcy5yZWNvdmVyZWRbW2ldXSArIGNvdW50cmllcy5kZWF0aHNbW2ldXSkKICBtYXgueSA8LSBtYXgoYyhtYXgueSwgeSksIG5hLnJtID0gVFJVRSkKfQp5cmFuZ2UgPC0gYygwLCBtYXgueSkKcGxvdCh4cmFuZ2UsIHlyYW5nZSwgbWFpbj0gIkFjdGl2ZSBDYXNlcyIsIHR5cGUgPSAibiIsIHhsYWIgPSAiRGF5cyBTaW5jZSBKYW51YXJ5IDIxLCAyMDIwIiwgeWxhYiA9ICJOdW1iZXIgb2YgQ2FzZXMiKQpmb3IgKGkgaW4gc2VxKDEsIGNvdW50cnkuY291bnQpKSB7CiAgeSA8LSBjb3VudHJpZXMuY29uZmlybWVkW1tpXV0gLSAoY291bnRyaWVzLnJlY292ZXJlZFtbaV1dICsgY291bnRyaWVzLmRlYXRoc1tbaV1dKQogIGxpbmVzKHNlcSgxLCBkKSwgeSwgdHlwZSA9ICJiIiwgY29sID0gY29sW2ldLCBsdHkgPSBsdHlbaV0sIHBjaCA9IHBjaFtpXSwgbHcgPSAxKQp9CmdyaWQoKQpsZWdlbmQoInRvcGxlZnQiLCBsZWdlbmQgPSBjb3VudHJ5Lm5hbWVzLCBjb2wgPSBjb2wsIGx0eSA9IGx0eSwgcGNoID0gcGNoLCB0aXRsZSA9ICJDb3VudHJ5IikKCm1pbi55IDwtIDAKbWF4LnkgPC0gMApmb3IgKGkgaW4gc2VxKDEsIGNvdW50cnkuY291bnQpKSB7CiAgeSA8LSBjb3VudHJpZXMuY29uZmlybWVkW1tpXV0gLSAoY291bnRyaWVzLnJlY292ZXJlZFtbaV1dICsgY291bnRyaWVzLmRlYXRoc1tbaV1dKQogIHkgPC0gdGFpbCh5LCAxMCkKICBtYXgueSA8LSBtYXgoYyhtYXgueSwgZGlmZih5KSksIG5hLnJtID0gVFJVRSkKICBtaW4ueSA8LSBtaW4oYyhtaW4ueSwgZGlmZih5KSksIG5hLnJtID0gVFJVRSkKfQp4cmFuZ2UgPC0gYyhkYXkuY291bnQtMTAsIGRheS5jb3VudCkKeXJhbmdlIDwtIGMobWluLnksIG1heC55ICogMikKcGxvdCh4cmFuZ2UsIHlyYW5nZSwgbWFpbj0gIk5ldyBBY3RpdmUgQ2FzZXMgcGVyIERheSAobGFzdCAxMCBkYXlzKSIsIHR5cGUgPSAibiIsIHhsYWIgPSAiRGF5cyBTaW5jZSAyMDIwLTAxLTIxIiwgeWxhYiA9ICJOdW1iZXIgb2YgTmV3IEFjdGl2ZSBDYXNlcyBwZXIgRGF5IikKZm9yIChpIGluIHNlcSgxLCBjb3VudHJ5LmNvdW50KSkgewogIHkgPC0gY291bnRyaWVzLmNvbmZpcm1lZFtbaV1dIC0gKGNvdW50cmllcy5yZWNvdmVyZWRbW2ldXSArIGNvdW50cmllcy5kZWF0aHNbW2ldXSkKICBsaW5lcyhzZXEoMiwgZGF5LmNvdW50KSAtIDAuNDUgKyAwLjA4ICogaSwgZGlmZih5KSwgdHlwZSA9ICJoIiwgY29sID0gY29sW2ldLCBsdHkgPSAxLCBsdyA9IDQpCn0KZ3JpZCgpCmxlZ2VuZCgidG9wbGVmdCIsIGxlZ2VuZCA9IGNvdW50cnkubmFtZXMsIGNvbCA9IGNvbCwgbHR5ID0gMSwgbHcgPSA0LCB0aXRsZSA9ICJDb3VudHJ5IiwgbmNvbCA9IDQsIGNleCA9IDAuOSkKYGBgCgojIEFib3V0CgpBbGwgdGhlIGdyYXBocyBhYm92ZSBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIGRhdGEgcHJvdmlkZWQgYnkgSm9obnMgSG9wa2lucyBDU1NFIChwcm92aWRlZCB0byB0aGUgcHVibGljIHN0cmljdGx5IGZvciBlZHVjYXRpb25hbCBhbmQgYWNhZGVtaWMgcmVzZWFyY2ggcHVycG9zZXMpLgoKVGhlIHNvdXJjZSBjb2RlIGZvciBnZW5lcmF0aW5nIHRoZSBncmFwaHMgaXMgYXZhaWxhYmxlIHVuZGVyIE1JVCBMaWNlbnNlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9waGlsaXBwZS1kb2NvdXJ0L0NPVklELTE5L2Jsb2IvbWFzdGVyL2NvdmlkXzE5X3dlc3Rlcm5fZXVyb3BlLlJtZC4KClRoZSBkYXRhIGFyZSBwcm92aWRlZCBhcyAqMjAxOSBOb3ZlbCBDb3JvbmF2aXJ1cyBDT1ZJRC0xOSAoMjAxOS1uQ29WKSBEYXRhIFJlcG9zaXRvcnkgYnkgSm9obnMgSG9wa2lucyBDU1NFKiAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9DU1NFR0lTYW5kRGF0YS9DT1ZJRC0xOSkuCgpTZWUgaHR0cHM6Ly9naXRodWIuY29tL3BoaWxpcHBlLWRvY291cnQvQ09WSUQtMTkvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIGZvciBtb3JlIGRldGFpbHMuCgojIyBEYXRhIFNvdXJjZXMKCiogQWdncmVnYXRlZCBkYXRhIHNvdXJjZXM6CiAgKiBXb3JsZCBIZWFsdGggT3JnYW5pemF0aW9uIChXSE8pOiBodHRwczovL3d3dy53aG8uaW50LwogICogRXVyb3BlYW4gQ2VudHJlIGZvciBEaXNlYXNlIFByZXZlbnRpb24gYW5kIENvbnRyb2wgKEVDREMpOiBodHRwczovL3d3dy5lY2RjLmV1cm9wYS5ldS9lbi9nZW9ncmFwaGljYWwtZGlzdHJpYnV0aW9uLTIwMTktbmNvdi1jYXNlcyAKICAqIERYWS5jbi4gUG5ldW1vbmlhLiAyMDIwLiBodHRwOi8vM2cuZHh5LmNuL25ld2g1L3ZpZXcvcG5ldW1vbmlhCiAgKiBVUyBDREM6IGh0dHBzOi8vd3d3LmNkYy5nb3YvY29yb25hdmlydXMvMjAxOS1uY292L2luZGV4Lmh0bWwKICAqIEJOTyBOZXdzOiBodHRwczovL2Jub25ld3MuY29tL2luZGV4LnBocC8yMDIwLzAyL3RoZS1sYXRlc3QtY29yb25hdmlydXMtY2FzZXMvCiAgKiBXb3JsZG9NZXRlcnM6IGh0dHBzOi8vd3d3Lndvcmxkb21ldGVycy5pbmZvL2Nvcm9uYXZpcnVzLyAgCiAgKiAxUG9pbnQzQXJjZXM6IGh0dHBzOi8vY29yb25hdmlydXMuMXBvaW50M2FjcmVzLmNvbS9lbiAgCiAgKiBDT1ZJRCBUcmFja2luZyBQcm9qZWN0OiBodHRwczovL2NvdmlkdHJhY2tpbmcuY29tL2RhdGEuIChVUyBUZXN0aW5nIGFuZCBIb3NwaXRhbGl6YXRpb24gRGF0YS4gV2UgdXNlIHRoZSBtYXhpbXVtIHJlcG9ydGVkIHZhbHVlIGZyb20gIkN1cnJlbnRseSIgYW5kICJDdW11bGF0aXZlIiBIb3NwaXRhbGl6ZWQgZm9yIG91ciBob3NwaXRhbGl6YXRpb24gbnVtYmVyIHJlcG9ydGVkIGZvciBlYWNoIHN0YXRlLikKCiogVVMgZGF0YSBzb3VyY2VzIGF0IHRoZSBzdGF0ZSAoQWRtaW4xKSBvciBjb3VudHkvY2l0eSAoQWRtaW4yKSBsZXZlbDogIAogICogV2FzaGluZ3RvbiBTdGF0ZSBEZXBhcnRtZW50IG9mIEhlYWx0aDogaHR0cHM6Ly93d3cuZG9oLndhLmdvdi9lbWVyZ2VuY2llcy9jb3JvbmF2aXJ1cwogICogTWFyeWxhbmQgRGVwYXJ0bWVudCBvZiBIZWFsdGg6IGh0dHBzOi8vY29yb25hdmlydXMubWFyeWxhbmQuZ292LwogICogTmV3IFlvcmsgU3RhdGUgRGVwYXJ0bWVudCBvZiBIZWFsdGg6IGh0dHBzOi8vaGVhbHRoLmRhdGEubnkuZ292L0hlYWx0aC9OZXctWW9yay1TdGF0ZS1TdGF0ZXdpZGUtQ09WSUQtMTktVGVzdGluZy94ZHNzLXU1M2UvZGF0YQogICogTllDIERlcGFydG1lbnQgb2YgSGVhbHRoIGFuZCBNZW50YWwgSHlnaWVuZTogaHR0cHM6Ly93d3cxLm55Yy5nb3Yvc2l0ZS9kb2gvY292aWQvY292aWQtMTktZGF0YS5wYWdlIGFuZCBodHRwczovL2dpdGh1Yi5jb20vbnljaGVhbHRoL2Nvcm9uYXZpcnVzLWRhdGEKICAqIEZsb3JpZGEgRGVwYXJ0bWVudCBvZiBIZWFsdGggRGFzaGJvYXJkOiBodHRwczovL3NlcnZpY2VzMS5hcmNnaXMuY29tL0NZMUxYeGw5emxKZUJ1UlovYXJjZ2lzL3Jlc3Qvc2VydmljZXMvRmxvcmlkYV9DT1ZJRDE5X0Nhc2VzL0ZlYXR1cmVTZXJ2ZXIvMAogICAgYW5kIGh0dHBzOi8vZmRvaC5tYXBzLmFyY2dpcy5jb20vYXBwcy9vcHNkYXNoYm9hcmQvaW5kZXguaHRtbCMvOGQwZGUzM2YyNjBkNDQ0Yzg1MmE2MTVkYzc4MzdjODYKICAqIENvbG9yYWRvOiBodHRwczovL2NvdmlkMTkuY29sb3JhZG8uZ292L2NvdmlkLTE5LWRhdGEKICAqIFZpcmdpbmlhOiBodHRwczovL3d3dy52ZGgudmlyZ2luaWEuZ292L2Nvcm9uYXZpcnVzLwogICogTm9ydGhlcm4gTWFyaWFuYSBJc2xhbmRzIENOTUkgRGVwYXJ0bWVudCBvZiBQdWJsaWMgSGVhbHRoOiBodHRwczovL2NubWljaGNjLm1hcHMuYXJjZ2lzLmNvbS9hcHBzL29wc2Rhc2hib2FyZC9pbmRleC5odG1sIy80MDYxYjY3NGZjOTY0ZWZlODRmNzc3NGI3OTc5ZDJiNQogICogTWlzc291cmkgRGVwYXJ0bWVudCBvZiBIZWFsdGg6IGh0dHBzOi8vd3d3LmFyY2dpcy5jb20vYXBwcy9NYXBTZXJpZXMvaW5kZXguaHRtbD9hcHBpZD04ZTAxYTVkOGQ4YmQ0YjRmODVhZGQwMDZmOWUxNGE5ZAogICogU3QuIExvdWlzIENpdHkgRGVwYXJ0bWVudCBvZiBIZWFsdGg6IGh0dHBzOi8vd3d3LnN0bG91aXMtbW8uZ292L2NvdmlkLTE5L2RhdGEvI3RvdGFsc0J5RGF0ZQogICogU3QuIExvdWlzIENvdW50eTogaHR0cHM6Ly9zdGxjb3JvbmEuY29tL3Jlc291cmNlcy9jb3ZpZC0xOS1zdGF0aXN0aWNzMS8KICAqIE1hc3NhY2h1c2V0dHM6IGh0dHBzOi8vd3d3Lm1hc3MuZ292L2luZm8tZGV0YWlscy9jb3ZpZC0xOS1yZXNwb25zZS1yZXBvcnRpbmcKICAqIE1pY2hpZ2FuOiBodHRwczovL3d3dy5taWNoaWdhbi5nb3YvY29yb25hdmlydXMvMCw5NzUzLDctNDA2LTk4MTYzXzk4MTczLS0tLDAwLmh0bWwgCiAgKiBJbGxpbm9pcyBEZXBhcnRtZW50IG9mIFB1YmxpYyBIZWFsdGg6IGh0dHBzOi8vZHBoLmlsbGlub2lzLmdvdi9jb3ZpZDE5CiAgKiBJbmRpYW5hIFN0YXRlIERlcGFydG1lbnQgb2YgSGVhbHRoOiBodHRwczovL2h1Yi5tcGguaW4uZ292L2RhdGFzZXQ/cT1DT1ZJRAogICogQ29ubmVjdGljdXQgRGVwYXJ0bWVudCBvZiBQdWJsaWMgSGVhbHRoOiBodHRwczovL2RhdGEuY3QuZ292L3N0b3JpZXMvcy9DT1ZJRC0xOS1kYXRhL3dhM2ctdGZ2Yy8KICAqIE9oaW8gRGVwYXJ0bWVudCBvZiBIZWFsdGg6IGh0dHBzOi8vY29yb25hdmlydXMub2hpby5nb3Yvd3BzL3BvcnRhbC9nb3YvY292aWQtMTkvaG9tZQogICogT3JlZ29uIE9mZmljZSBvZiBFbWVyZ2VuY3kgTWFuYWdlbWVudDogaHR0cHM6Ly9leHBlcmllbmNlLmFyY2dpcy5jb20vZXhwZXJpZW5jZS9mZmY5ZjgzODI3YzU0NjE1ODNjZDAxNGZkZjQ1ODdkZQogICogVGVubmVzc2VlIERlcGFydG1lbnQgb2YgSGVhbHRoOiBodHRwczovL3d3dy50bi5nb3YvaGVhbHRoL2NlZGVwL25jb3YuaHRtbAogICogUmhvZGUgSXNsYW5kIERlcGFydG1lbnQgb2YgSGVhbHRoOiBodHRwczovL3JpLWRlcGFydG1lbnQtb2YtaGVhbHRoLWNvdmlkLTE5LWRhdGEtcmloZWFsdGguaHViLmFyY2dpcy5jb20vCiAgKiBXaXNjb25zaW4gRGVwYXJ0bWVudCBvZiBIZWFsdGggU2VydmljZXM6IGh0dHBzOi8vd3d3LmRocy53aXNjb25zaW4uZ292L2NvdmlkLTE5L2RhdGEuaHRtCiAgKiBOb3J0aCBDYXJvbGluYSBDaXR5IG9mIEdyZWVudmlsbGUgR0lTOiBodHRwczovL3d3dy5hcmNnaXMuY29tL2FwcHMvb3BzZGFzaGJvYXJkL2luZGV4Lmh0bWwjLzdhZWFjNjk1Y2FmYTQwNjViYTE1MDViMWNmYTcyNzQ3CiAgKiBJb3dhIFN0YXRlIEdvdmVybm1lbnQ6IGh0dHBzOi8vY29yb25hdmlydXMuaW93YS5nb3YvCiAgKiBNaW5uZXNvdGEgRGVwYXJ0bWVudCBvZiBIZWFsdGg6IGh0dHBzOi8vd3d3LmhlYWx0aC5zdGF0ZS5tbi51cy9kaXNlYXNlcy9jb3JvbmF2aXJ1cy9zaXR1YXRpb24uaHRtbAogICogQWxhYmFtYSBTYW1mb3JkIFVuaXZlcnNpdHkncyBEZXBhcnRtZW50IG9mIEdlb2dyYXBoeSBhbmQgU29jaW9sb2d5OiBodHRwczovL2V4cGVyaWVuY2UuYXJjZ2lzLmNvbS9leHBlcmllbmNlL2UwM2Y4N2U0OGEyMzRmZWViYmFkMjdkMGVlN2ZmODI0CiAgKiBNaXNzaXNzaXBwaSBTdGF0ZSBEZXBhcnRtZW50IG9mIEhlYWx0aDogaHR0cHM6Ly9tc2RoLm1zLmdvdi9tc2Roc2l0ZS9fc3RhdGljLzE0LDAsNDIwLmh0bWwKICAqIE5lYnJhc2thIERlcGFydG1lbnQgb2YgSGVhbHRoIGFuZCBIdW1hbiBTZXJ2aWNlczogaHR0cHM6Ly9leHBlcmllbmNlLmFyY2dpcy5jb20vZXhwZXJpZW5jZS9lY2UwZGIwOWRhNGQ0Y2E2ODI1MmMzOTY3YWExZTlkZAogICogU291dGggQ2Fyb2xpbmEgRGVwYXJ0bWVudCBvZiBIZWFsdGggYW5kIEVudmlyb25tZW50YWwgQ29udHJvbDogaHR0cHM6Ly9zY2RoZWMuZ292L2luZmVjdGlvdXMtZGlzZWFzZXMvdmlydXNlcy9jb3JvbmF2aXJ1cy1kaXNlYXNlLTIwMTktY292aWQtMTkvc2MtdGVzdGluZy1kYXRhLXByb2plY3Rpb25zLWNvdmlkLTE5CiAgKiBOZXZhZGEgRGVwYXJ0bWVudCBvZiBIZWFsdGggYW5kIEh1bWFuIFNlcnZpY2VzOiBodHRwczovL252aGVhbHRocmVzcG9uc2UubnYuZ292LwogICogTmV3IEplcnNleSBEZXBhcnRtZW50IG9mIEhlYWx0aDogaHR0cHM6Ly9jb3ZpZDE5Lm5qLmdvdi8KICAqIERlbGF3YXJlIEVtZXJnZW5jeSBNYW5hZ2VtZW50IEFnZW5jeTogaHR0cHM6Ly9jb3JvbmF2aXJ1cy5kZWxhd2FyZS5nb3YvCiAgKiBVdGFoIERlcGFydG1lbnQgb2YgSGVhbHRoOiBodHRwczovL2Nvcm9uYXZpcnVzLWRhc2hib2FyZC51dGFoLmdvdi8jb3ZlcnZpZXcKICAqIEFyaXpvbmEgRW1lcmdlbmN5IFN1cHBvcnQgRnVuY3Rpb24gKEVTRikvUmVjb3ZlcnkgU3VwcG9ydCBGdW5jdGlvbiAoUlNGKSBPcGVyYXRpb25zIERhc2hib2FyZDogaHR0cHM6Ly93d3cuYXJjZ2lzLmNvbS9hcHBzL01hcFNlcmllcy9pbmRleC5odG1sP2FwcGlkPTYyZTZiZmE2ODJhMzRlNmFhZTlkOTI1NWFjODY1NDY3CiAgKiBEZXBhcnRhbWVudG8gZGUgU2FsdWQsIFB1ZXJ0byBSaWNvOiBodHRwczovL2Jpb3NlZ3VyaWRhZC5tYXBzLmFyY2dpcy5jb20vYXBwcy9vcHNkYXNoYm9hcmQvaW5kZXguaHRtbCMvZDczMDhjMWFiYjQ3NDdlNTg0MzI5YWRmMTIxNTEyNWUKICAqIEFya2Fuc2FzIERlcGFydG1lbnQgb2YgSGVhbHRoOiBodHRwczovL2V4cGVyaWVuY2UuYXJjZ2lzLmNvbS9leHBlcmllbmNlL2MyZWY0YTRmY2JlNTQ1OGZiZjJlNDhhMjFlNGZlY2U5CiAgKiBNYWluZSBEZXBhcnRtZW50IG9mIEhlYWx0aCBhbmQgSHVtYW4gU2VydmljZXM6IGh0dHBzOi8vd3d3Lm1haW5lLmdvdi9kaGhzL21lY2RjL2luZmVjdGlvdXMtZGlzZWFzZS9lcGkvYWlyYm9ybmUvY29yb25hdmlydXMvZGF0YS5zaHRtbAogICogUGVubnN5bHZhbmlhIERlcGFydG1lbnQgb2YgSGVhbHRoOiBodHRwczovL3d3dy5oZWFsdGgucGEuZ292L3RvcGljcy9kaXNlYXNlL2Nvcm9uYXZpcnVzL1BhZ2VzL0Nhc2VzLmFzcHgKICAqIENpdHkgb2YgUGhpbGFkZWxwaGlhOiBodHRwczovL3d3dy5waGlsYS5nb3YvcHJvZ3JhbXMvY29yb25hdmlydXMtZGlzZWFzZS0yMDE5LWNvdmlkLTE5LwogICogTGFuY2FzdGVyIENvdW50eTogaHR0cHM6Ly9jb3ZpZC0xOS1sYW5jYXN0ZXJjb3VudHlwYS5odWIuYXJjZ2lzLmNvbS8KICAqIENoZXN0ZXIgQ291bnR5OiBodHRwczovL2NoZXNjby5tYXBzLmFyY2dpcy5jb20vYXBwcy9vcHNkYXNoYm9hcmQvaW5kZXguaHRtbCMvOTc1MDgyZDU3OTQ1NGMzY2E3ODc3ZGIwYTQ0ZTYxY2EKICAqIExvdWlzaWFuYSBEZXBhcnRtZW50IG9mIEhlYWx0aDogaHR0cDovL2xkaC5sYS5nb3YvY29yb25hdmlydXMvCiAgKiBHb3Zlcm5tZW50IG9mIFRoZSBEaXN0cmljdCBvZiBDb2x1bWJpYTogaHR0cHM6Ly9jb3JvbmF2aXJ1cy5kYy5nb3YvcGFnZS9jb3JvbmF2aXJ1cy1kYXRhIAoKKiBOb24tVVMgZGF0YSBzb3VyY2VzIGF0IHRoZSBjb3VudHJ5L3JlZ2lvbiAoQWRtaW4wKSBvciBzdGF0ZS9wcm92aW5jZSAoQWRtaW4xKSBsZXZlbDoKICAqIE5hdGlvbmFsIEhlYWx0aCBDb21taXNzaW9uIG9mIHRoZSBQZW9wbGXigJlzIFJlcHVibGljIG9mIENoaW5hIChOSEMpOgogICAgaHR0cDovL3d3dy5uaGMuZ292LmNuL3hjcy95cXRiL2xpc3RfZ3piZC5zaHRtbAogICogQ2hpbmEgQ0RDIChDQ0RDKTogaHR0cDovL3dlZWtseS5jaGluYWNkYy5jbi9uZXdzL1RyYWNraW5ndGhlRXBpZGVtaWMuaHRtCiAgKiBIb25nIEtvbmcgRGVwYXJ0bWVudCBvZiBIZWFsdGg6IGh0dHBzOi8vd3d3LmNocC5nb3YuaGsvZW4vZmVhdHVyZXMvMTAyNDY1Lmh0bWwKICAqIE1hY2F1IEdvdmVybm1lbnQ6IGh0dHBzOi8vd3d3LnNzbS5nb3YubW8vcG9ydGFsLwogICogVGFpd2FuIENEQzogaHR0cHM6Ly9zaXRlcy5nb29nbGUuY29tL2NkYy5nb3YudHcvMjAxOW5jb3YvdGFpd2FuP2F1dGh1c2VyPTAKICAqIEdvdmVybm1lbnQgb2YgQ2FuYWRhOiBodHRwczovL3d3dy5jYW5hZGEuY2EvZW4vcHVibGljLWhlYWx0aC9zZXJ2aWNlcy9kaXNlYXNlcy9jb3JvbmF2aXJ1cy5odG1sCiAgKiBBdXN0cmFsaWEgR292ZXJubWVudCBEZXBhcnRtZW50IG9mIEhlYWx0aDogaHR0cHM6Ly93d3cuaGVhbHRoLmdvdi5hdS9uZXdzL2Nvcm9uYXZpcnVzLXVwZGF0ZS1hdC1hLWdsYW5jZQogICogQ09WSUQgTGl2ZSAoQXVzdHJhbGlhKTogaHR0cHM6Ly93d3cuY292aWRsaXZlLmNvbS5hdS8KICAqIE1pbmlzdHJ5IG9mIEhlYWx0aCBTaW5nYXBvcmUgKE1PSCk6IGh0dHBzOi8vd3d3Lm1vaC5nb3Yuc2cvY292aWQtMTkKICAqIEl0YWx5IE1pbmlzdHJ5IG9mIEhlYWx0aDogaHR0cDovL3d3dy5zYWx1dGUuZ292Lml0L251b3ZvY29yb25hdmlydXMKICAqIERhdGkgQ09WSUQtMTkgSXRhbGlhIChJdGFseSk6IGh0dHBzOi8vZ2l0aHViLmNvbS9wY20tZHBjL0NPVklELTE5L3RyZWUvbWFzdGVyL2RhdGktcmVnaW9uaQogICogRnJlbmNoIEdvdmVybm1lbnQ6IGh0dHBzOi8vZGFzaGJvYXJkLmNvdmlkMTkuZGF0YS5nb3V2LmZyLyBhbmQgaHR0cHM6Ly9naXRodWIuY29tL29wZW5jb3ZpZDE5LWZyL2RhdGEvYmxvYi9tYXN0ZXIvZGlzdC9jaGlmZnJlcy1jbGVzLmpzb24KICAqIE9wZW5DT1ZJRDE5IEZyYW5jZTogaHR0cHM6Ly9naXRodWIuY29tL29wZW5jb3ZpZDE5LWZyCiAgKiBQYWxlc3RpbmUgKFdlc3QgQmFuayBhbmQgR2F6YSk6IGh0dHBzOi8vY29yb25hLnBzL2RldGFpbHMKICAqIElzcmFlbDogaHR0cHM6Ly9nb3ZleHRyYS5nb3YuaWwvbWluaXN0cnktb2YtaGVhbHRoL2Nvcm9uYS9jb3JvbmEtdmlydXMvCiAgKiBNaW5pc3RyeSBvZiBIZWFsdGgsIFJlcHVibGljIG9mIEtvc292bzogaHR0cHM6Ly9rb3NvdmEuaGVhbHRoLyBhbmQgaHR0cHM6Ly9jb3ZpZGtzLnMzLmFtYXpvbmF3cy5jb20vZGF0YS5qc29uCiAgKiBCZXJsaW5lciBNb3JnZW5wb3N0IChHZXJtYW55KTogaHR0cHM6Ly9pbnRlcmFrdGl2Lm1vcmdlbnBvc3QuZGUvY29yb25hLXZpcnVzLWthcnRlLWluZmVrdGlvbmVuLWRldXRzY2hsYW5kLXdlbHR3ZWl0LwogICogcnR2ZSAoU3BhaW4pOiBodHRwczovL3d3dy5ydHZlLmVzL25vdGljaWFzLzIwMjAwNTE0L21hcGEtZGVsLWNvcm9uYXZpcnVzLWVzcGFuYS8yMDA0NjgxLnNodG1sCiAgKiBNaW5pc3RyeSBvZiBIZWFsdGgsIFJlcHVibGljIG9mIFNlcmJpYTogaHR0cHM6Ly9jb3ZpZDE5LnJzL2hvbWVwYWdlLWVuZ2xpc2gvIAogICogQ2hpbGU6IGh0dHBzOi8vd3d3Lm1pbnNhbC5jbC9udWV2by1jb3JvbmF2aXJ1cy0yMDE5LW5jb3YvY2Fzb3MtY29uZmlybWFkb3MtZW4tY2hpbGUtY292aWQtMTkvCiAgKiBCcmF6aWwgTWluaXN0cnkgb2YgSGVhbHRoOiBodHRwczovL2NvdmlkLnNhdWRlLmdvdi5ici8KICAqIEJyYXppbDogaHR0cHM6Ly9naXRodWIuY29tL3djb3RhL2NvdmlkMTlici4gRGF0YSBkZXNjcmliZWQgaW4gW0RPSTogMTAuMTU5MC9TY2lFTE9QcmVwcmludHMuMzYyXShodHRwczovL2RvaS5vcmcvMTAuMTU5MC9TY2lFTE9QcmVwcmludHMuMzYyKQogICogR29iaWVyb25vIERlIE1leGljbzpodHRwczovL2NvdmlkMTkuc2luYXZlLmdvYi5teC8KICAqIEphcGFuIENPVklELTE5IENvcm9uYXZpcnVzIFRyYWNrZXI6IGh0dHBzOi8vY292aWQxOWphcGFuLmNvbS8jYWxsLXByZWZlY3R1cmVzCiAgKiBNb25pdG9yZW8gZGVsIENPVklELTE5IGVuIFBlcsO6IC0gIFBvbGljw61hIE5hY2lvbmFsIGRlbCBQZXLDuiAoUE5QKSAtIERpcmVjY2nDs24gZGUgSW50ZWxpZ2VuY2lhIChESVJJTik6IGh0dHBzOi8vd3d3LmFyY2dpcy5jb20vYXBwcy9vcHNkYXNoYm9hcmQvaW5kZXguaHRtbCMvZjkwYTdhODdhZjI1NDg2OTlkNmU3YmI3MmY1NTQ3YzIgYW5kIE1pbmlzdGVyaW8gZGUgU2FsdWQgZGVsIFBlcsO6OiBodHRwczovL2NvdmlkMTkubWluc2EuZ29iLnBlL3NhbGFfc2l0dWFjaW9uYWwuYXNwCiAgQ29sb21iaWEgTmF0aW9uYWwgSW5zdGl0dXRlIG9mIEhlYWx0aDogaHR0cDovL3d3dy5pbnMuZ292LmNvL05vdGljaWFzL1BhZ2luYXMvQ29yb25hdmlydXMuYXNweAogIFJ1c3NpYTogaHR0cHM6Ly94bi0tODBhZXNmcGViYWdtZmJsYzBhLnhuLS1wMWFpL2luZm9ybWF0aW9uLwogIFVrcmFpbmU6IGh0dHBzOi8vY292aWQxOS5ybmJvLmdvdi51YS8KICBQdWJsaWMgSGVhbHRoIEFnZW5jeSBvZiBTd2VkZW46IGh0dHBzOi8vZXhwZXJpZW5jZS5hcmNnaXMuY29tL2V4cGVyaWVuY2UvMDlmODIxNjY3Y2U2NGJmN2JlNmY5Zjg3NDU3ZWQ5YWEKICBJbmRpYSBNaW5pc3RyeSBvZiBIZWFsdGggYW5kIEZhbWlseSBXZWxmYXJlOiBodHRwczovL3d3dy5tb2hmdy5nb3YuaW4vCiAgR292ZXJubWVudCBvZiBQYWtpc3RhbjogaHR0cDovL2NvdmlkLmdvdi5way9zdGF0cy9wYWtpc3RhbgogIFRoZSBVSyBHb3Zlcm5tZW50OiBodHRwczovL2Nvcm9uYXZpcnVzLmRhdGEuZ292LnVrLyNjYXRlZ29yeT1uYXRpb25zJm1hcD1yYXRlCiAgU2NvdHRpc2ggR292ZXJubWVudDogaHR0cHM6Ly93d3cuZ292LnNjb3QvcHVibGljYXRpb25zL2Nvcm9uYXZpcnVzLWNvdmlkLTE5LXRyZW5kcy1pbi1kYWlseS1kYXRhLwogIE5ldGhlcmxhbmRzIE5hdGlvbmFsIEluc3RpdHV0ZSBmb3IgSGVhbHRoIGFuZCBFbnZpcm9ubWVudDogaHR0cHM6Ly9leHBlcmllbmNlLmFyY2dpcy5jb20vZXhwZXJpZW5jZS9lYTA2NDA0NzUxOTA0MDQ2OWFjYjhkYTA1YzBmMTAwZAogIEljZWxhbmQgVGhlIERpcmVjdG9yYXRlIG9mIEhlYWx0aCBhbmQgVGhlIERlcGFydG1lbnQgb2YgQ2l2aWwgUHJvdGVjdGlvbiBhbmQgRW1lcmdlbmN5IE1hbmFnZW1lbnQ6IGh0dHBzOi8vd3d3LmNvdmlkLmlzL2RhdGEKCiMjIFRlcm1zIG9mIFVzZQoKKiBEYXRhIDogQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiA0LjAgSW50ZXJuYXRpb25hbCAoQ0MgQlkgNC4wKSBieSB0aGUgSm9obnMgSG9wa2lucyBVbml2ZXJzaXR5IG9uIGJlaGFsZiBvZiBpdHMgQ2VudGVyIGZvciBTeXN0ZW1zIFNjaWVuY2UgaW4gRW5naW5lZXJpbmcuICBDb3B5cmlnaHQgSm9obnMgSG9wa2lucyBVbml2ZXJzaXR5IDIwMjAuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQ1NTRUdJU2FuZERhdGEvQ09WSUQtMTkvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kLgoqIFNvdXJjZSBjb2RlIGZvciBnZW5lcmF0aW5nIGdyYXBoczogQ29weXJpZ2h0IFBoaWxpcHBlIERvY291cnQuIExpY2Vuc2VkIHVuZGVyIE1JVCBMaWNlbnNlLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3BoaWxpcHBlLWRvY291cnQvQ09WSUQtMTkvYmxvYi9tYXN0ZXIvY292aWRfMTlfd2VzdGVybl9ldXJvcGUuUm1kLgoqIEdyYXBoaWNzIDogUHVibGljIERvbWFpbgoK